package com.cyc.basic.leecode.排序;

import java.util.Arrays;

/**
 * 冒泡排序算法
 * @author fei
 */
public class BubbleSort {

    private static void bubbleSort(int[] nums) {
        int num = 1;
        boolean hasChange = true;
        for (int i = 0, n = nums.length; i < n - 1 && hasChange; ++i) {
            hasChange = false;
            for (int j = 0; j < n - i - 1; ++j) {
                if (nums[j] > nums[j + 1]) {
                    swap(nums, j, j + 1);
                    hasChange = true;
                }
                num++;
            }
        }

        System.out.println("改进型冒泡一共循环的次数为: " + num);

        num = 1;
        for (int i = 0, n = nums.length; i < n - 1; ++i) {
            for (int j = 0; j < n - i - 1; ++j) {
                if (nums[j] > nums[j + 1]) {
                    swap(nums, j, j + 1);
                }
                num++;
            }
        }
        //时间复杂度
        /**
         * 一共要进行(n-1)次循环,每一次循环都要进行当前n-1次比较,所以比较的次数为
         * (n-1)+(n-2)+(n-3)+...+3+2+1=
         * 由于参数会进行抵消, 也就是只会剩下二分之一 n-1个n , 结果也就是 n(n-1)/2 = n^2/2-n/2 ,
         * 由于时间复杂度和系数没有关系,且取决于最大的那个n ,所以复杂度为O(n^2)
         */


        System.out.println("原始冒泡:一共循环的次数为: " + num);
    }

    private static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }

    public static void main(String[] args) {
//        int[] nums = {1, 2, 7, 9, 5, 8};
//        int[] nums = {1, 2, 5, 7, 8, 9};
//        int[] nums = {6, 5, 4, 3, 2, 1};
        int[] nums = {1, 2, 3, 6, 5, 4};
        bubbleSort(nums);
        System.out.println(Arrays.toString(nums));
    }
}
